{
for (i = 0; match && i < lut_size; i++)
{
- fprintf (stderr, "%i: %f %f\n",
- i, lut[i], gamma_2_2_to_linear (i / (lut_size-1.0)));
-
if (fabs (lut[i] - gamma_2_2_to_linear (i / (lut_size-1.0))) > 0.015)
match = 0;
}
if (n_lut)
{
+ int j;
trc_db[i].lut_size = n_lut;
trc_db[i].lut = babl_calloc (sizeof (float), n_lut);
memcpy (trc_db[i].lut, lut, sizeof (float) * n_lut);
+ trc_db[i].inv_lut = babl_calloc (sizeof (float), n_lut);
+ for (j = 0; j < n_lut; j++)
+ trc_db[i].inv_lut[j] =
+ babl_trc_to_linear (BABL(&trc_db[i]), trc_db[i].lut[(int) ( j/(n_lut-1.0) * (n_lut-1))]);
+
}
-
+
return (Babl*)&trc_db[i];
}
double gamma;
char name[128];
float *lut;
+ float *inv_lut;
} BablTRC;
static inline double babl_trc_lut_from_linear (const Babl *trc_, double value)
{
- return 0;
+ BablTRC *trc = (void*)trc_;
+ int entry = value * trc->lut_size + 0.5;
+ double ret = trc->inv_lut[
+ (entry >= 0 && entry < trc->lut_size) ?
+ entry :
+ trc->lut_size-1];
+ /* XXX: fixme, do linear interpolation */
+ return ret;
}
static inline double babl_trc_lut_to_linear (const Babl *trc_, double value)
{
- return 0;
+ BablTRC *trc = (void*)trc_;
+ int entry = value * trc->lut_size + 0.5;
+ double ret = trc->lut[
+ (entry >= 0 && entry < trc->lut_size) ?
+ entry :
+ trc->lut_size-1];
+ /* XXX: fixme, do linear interpolation */
+ return ret;
}
static inline double _babl_trc_from_linear (const Babl *trc_, double value)